/**
 * 
 */
package co.com.sed.model.peers;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import co.com.sed.model.beans.Funcionario;
import co.com.sed.model.beans.Usuario;
import co.com.sed.model.util.Util;

/**
 * @author Mejia
 *
 */
public class UsuarioPeer {

	private static final String BUSCAR_USUARIOS =
			"SELECT id_usuario, funcionario, usuario, clave, pregunta, respuesta,activo FROM usuario";

	private static final String BUSCAR_USUARIO  =	
			"SELECT id_usuario, funcionario, usuario, clave, pregunta, respuesta,activo  FROM usuario "+
			"WHERE id_usuario = &id_usuario";

	private static final String INSERTAR_USUARIO  =
			"INSERT INTO usuario (funcionario, usuario, clave, pregunta, respuesta,activo ) VALUES "+
			"(&funcionario, '&usuario', &clave, '&pregunta', '&respuesta', &activo )";

	private static final String ACTUALIZAR_USUARIO =
			"UPDATE usuario "+
			"SET funcionario = &funcionario , usuario = &usuario , clave = '&clave', pregunta = &pregunta, respuesta = &respuesta, activo = &activo "+
			"WHERE id_usuario = &id_usuario";

	private static final String ELIMINAR_USUARIO =
			"DELETE FROM usuario "+
			"WHERE id_usuario = &id_usuario";

	
	/** 
	 * busca en la base de datos todos los registros de la tabla "usuario"
	 *
	 * 	* @param stmt			referencia al Statement, pasado por DataManager para realizar la consulta
	 * 
	 * @return					lista de usuario
	 * @see         			Usuario, Statement
	 */
	public static ArrayList<Usuario> buscarUsuarios(Statement stmt) {
		ArrayList<Usuario> usuarios = new ArrayList<Usuario>();

		String sql = BUSCAR_USUARIOS; //"SELECT id_usuario, id_funcionario, usuario, clave, pregunta, respuesta,activo FROM usuario";

		ResultSet rs;
		try {
			rs = stmt.executeQuery(sql);
			try {
				while (rs.next()) {
					Usuario usu = new Usuario();

					usu.setIdUsuario(rs.getInt("id_usuario"));
					usu.setFuncionario(new Funcionario(rs.getInt("funcionario")));
					usu.setUsuario(rs.getString("usuario"));
					usu.setPregunta(rs.getString("pregunta"));
					usu.setClave(rs.getString("clave"));
					usu.setRespuesta(rs.getString("respuesta"));
					usu.setActivo(rs.getBoolean("activo"));
					
					
					
					usuarios.add(usu);
				}
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("No es posible consultar la base de datos:"
					+ e.getMessage());
			e.printStackTrace();
		}

		return usuarios;
	}
	
	/** 
	 * busca en la base de datos un registro de la tabla "usuario"
	 * 
	 * @param stmt				referencia al Statement, pasado por DataManager para realizar la consulta
	 * @param idUsuario		    id de la usuario que se desea cosultar
	 * 
	 * @return					usuario buscada
	 * @see         			Usuario, Statement
	 */
	public static Usuario buscarUsuario(Statement stmt, int idUsuario) {
		Usuario usuario = new Usuario();

		String sql = BUSCAR_USUARIO;
		//"SELECT id_usuario, clave, rango FROM usuario "+
		//"WHERE id_usuario = &id_usuario";
		
		
		// se setean los "parametros"
		sql = sql.replaceAll("&id_usuario", String.valueOf(idUsuario));
		
		ResultSet rs;
		try {
			rs = stmt.executeQuery(sql);
			try {
				if (rs.next()) {
									
					usuario.setIdUsuario(rs.getInt("id_usuario"));
					usuario.setFuncionario(new Funcionario(rs.getInt("funcionario")));
					usuario.setUsuario(rs.getString("usuario"));
					usuario.setPregunta(rs.getString("pregunta"));
					usuario.setClave(rs.getString("clave"));
					usuario.setRespuesta(rs.getString("respuesta"));
					usuario.setActivo(rs.getBoolean("activo"));
					
				}
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("No es posible consultar la base de datos:" + e.getMessage());
			e.printStackTrace();
		}

		return usuario;
	}
	
	/** 
	 * Inserta un Usuario en la base de datos
	 * 
	 * @param stmt			referencia al Statement, pasado por DataManager para ejecutar la sentencia
	 * @param usuario		usuario que se va a insertar en la base de datos
	 *  
	 * @return				void
	 * @throws SQLException	si ocurre un error al insertar el registro en la base de datos
	 * 
	 * @see         		DataManager
	 */
	
	public static int insertarUsuario(Statement stmt, Usuario usuario) throws SQLException {
		int idNuevaUsuario = -1;
		ResultSet rs = null;
		
		try {
			String sql = INSERTAR_USUARIO;
			 //se setean los "parametros": &id_calificacion, &cualitativa, &cuantitativa, &descripcion 
			sql = sql.replaceAll("&id_funcionario", "" + usuario.getFuncionario())
					 .replaceAll("&usuario", usuario.getUsuario())
			         .replaceAll("&pregunta",  usuario.getPregunta())
					 .replaceAll("&clave", usuario.getClave())
					 .replaceAll("&respuesta",  usuario.getRespuesta())
					 .replaceAll("&activo", "" + usuario.getActivo());
			
			stmt.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS);
			
			rs = stmt.getGeneratedKeys();
			if (rs.next()) {
				idNuevaUsuario = rs.getInt("id_usuario");
				Util.print("nuevo registro: " + idNuevaUsuario);
			}
		} finally {
			rs.close();
		}
		
		return idNuevaUsuario;
	}
		
	

	/**
	 * Actualiza una usuario en la base de datos
	 * 
	 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
	 * @param usuario			usuario que se va a actualizar en la base de datos
	 * 
	 * @return					void
	 * @throws SQLException		si ocurre un error al actualizar el registro en la base de datos
	 * 
	 * @see         			DataManager
	 */
	
	public static void actualizarUsuario(Statement stmt, Usuario usuario) throws SQLException {
		String sql = ACTUALIZAR_USUARIO;
		 //se setean los "parametros": &id_usuario, &clave
		sql = sql.replaceAll("&id_usuario", "" + usuario.getIdUsuario())
				 .replaceAll("&funcionario", "" + usuario.getFuncionario())
				 .replaceAll("&usuario", usuario.getUsuario())
		         .replaceAll("&pregunta",  usuario.getPregunta())
				 .replaceAll("&clave", usuario.getClave())
				 .replaceAll("&respuesta",  usuario.getRespuesta())
				 .replaceAll("&activo", "" + usuario.getActivo());
		
		stmt.executeUpdate(sql);
	}
	
		/** 
		 * Elimina un Usuario en la base de datos
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
		 * @param Usuario	 		usurio que se va a eliminar en la base de datos
		 * 
		 * @return					void
		 * @throws SQLException		si ocurre un error al eliminar el registro en la base de datos
		 * 
		 * @see         			DataManager
		 */
	
	public static void eliminarUsuario(Statement stmt, Usuario usuario) throws SQLException {
		String sql = ELIMINAR_USUARIO;
		// se setean los "id_usuario = &id_usuario";
		sql = sql.replaceAll("&id_usuario", "" + usuario.getIdUsuario());

		stmt.executeUpdate(sql);
	}
	
}
